package Week_01

/*
思路：用一个指针pre 标记当前重复的位置，循环遍历数组
遇到重复的不移动 pre， 遇到不重复的放到pre位置，pre 移动

假定数组：
       idx    0  1  2  3  4  5  6
       nums  [1, 1, 2, 3, 0, 0, 9]

pre 标记 1 号位置, 假定 1 号位置和0号位置重复
i 遍历数组，范围 [1, 6]


pre=1
i=1
------------------------------------------------------------------------------------
nums[1] ≠ num[0] 不成立，表示 1 号位置确实重复，pre 不移动，i 向后移动
       idx    0  1  2  3  4  5  6
       nums  [1, 1, 2, 3, 0, 0, 9]

pre=1
i=2
------------------------------------------------------------------------------------
nums[2] ≠ num[1] 成立，表示 2 号位置与前面不重复，不重复位置放到pre位置，然后pre 移动，i 向后移动
       idx    0  1  2  3  4  5  6
       nums  [1, 2, 2, 3, 0, 0, 9]

pre=2
i=3
------------------------------------------------------------------------------------
nums[3] ≠ num[2] 成立，表示 3 号位置与前面不重复，不重复位置放到pre位置，然后pre 移动，i 向后移动
       idx    0  1  2  3  4  5  6
       nums  [1, 2, 3, 3, 0, 0, 9]

pre=3
i=4
------------------------------------------------------------------------------------
nums[4] ≠ num[3] 不成立，表示 4 号位置与前面重复，然后pre 不移动，i 向后移动
       idx    0  1  2  3  4  5  6
       nums  [1, 2, 3, 0, 0, 0, 9]

pre=3
i=5
------------------------------------------------------------------------------------
nums[5] ≠ num[4] 不成立，表示 5 号位置与前面重复，pre 不移动，i 向后移动
       idx    0  1  2  3  4  5  6
       nums  [1, 2, 3, 0, 0, 0, 9]

pre=3
i=6
------------------------------------------------------------------------------------
nums[6] ≠ num[5]  成立，表示 6 号位置与前面不重复，不重复位置放到pre位置，然后pre 移动，i 向后移动
       idx    0  1  2  3  4  5  6
       nums  [1, 2, 3, 0, 9, 0, 0]
*/

func RemoveDuplicate(nums []int) int {
	// 标记重复的位置
	pre := 1

	for i := 1; i < len(nums); i++ {

		// 不重复则pre位置填不重复元素
		// 指针向右移动
		if nums[i] != nums[i-1] {
			nums[pre] = nums[i]
			pre += 1
		}
	}

	return pre
}
